<?php

namespace Maestros\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Maestros\Model\Entity\Horario;
use Maestros\Model\Dao\HorarioDAO;
use Maestros\Controller\Service\GenericService;
use Maestros\Controller\Service\BloqueService;
use Maestros\Controller\Service\AulaService;
use Transaccion\Controller\Service\OrganizacionSeccionService;

//SERVICIO
class HorarioService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $horarioService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$horarioService == null) {
            self::$horarioService = new HorarioService($adapter);
        }
        return self::$horarioService;
    }

    public function getHorarioDao() {
        return HorarioDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type Id
     * @return type array
     */
    public function obtenerIdsHorario($id) {
        $horario = $this->obtenerHorarioSegunId($id);
        return $this->getIds($horario);
    }

    /**
     * @param type Id
     * @return type Objet
     */
    public function obtenerHorarioSegunId($id) {
        $registros = $this->getHorarioDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $horario = new Horario($data[0]);
        $horario->setBloque($data[0]['id_bloque']);
        $horario->setAula($data[0]['id_aula']);
        $horario->setOrganizacionSeccion($data[0]['id_organizacion_seccion']);
        return $horario;
    }

   /**
     * @param type $id
     * @return type Array
     */
    public function getRegistro($id) {
        $data = null;
        $success = false;
        $mensaje = 'HORARIO NO ENCONTRADO';
        $horario = $this->obtenerHorarioSegunId($id);
        //print_r($horario);
        if ($horario->getId() != null) {
            $data[0] = $horario->objectToArray();
            $mensaje = 'HORARIO ENCONTRADO';
            $success = true;
        }
        return $this->setOuput($success, $data, $mensaje);
        //return UtilsArrayController::organizarOutput($success, $data, null);
    }

    /**
     * @param type $id
     * @return type Array
     */
    public function getRegistroCompleto($id) {
        $horario = $this->obtenerHorarioSegunId($id);
        return $this->armarRegistroCompleto($horario);
    }

    /**
     * @param type Bloque
     * @return type Array
     */
    public function armarRegistroCompleto($horario) {
        $data = null;
        $success = false;
        $mensaje = 'HORARIO NO ENCONTRADO';
        $servicioBloque = BloqueService::getInstance($this->dbAdapter);
        $bloque = $servicioBloque->obtenerIdsBloque($horario->getBloque());
        $servicioAula = AulaService::getInstance($this->dbAdapter);
        $aula = $servicioAula->getRegistroCompleto($horario->getAula());
        $servicioOrganizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $organizacionSeccion = $servicioOrganizacionSeccion->getRegistroCompleto($horario->getOrganizacionSeccion());
        if ($horario->getId() != null) {
            $data[0] = $horario->objectToArray();
            $data[0]['_bloque'] = $bloque['data'][0];
            $data[0]['_aula'] = $aula['data'][0];
            $data[0]['_organizacion_seccion'] = $organizacionSeccion['data'][0];
            $mensaje = 'HORARIO ENCONTRADO';
            $success = true;
        }
        return $this->setOuput($success, $data, $mensaje);
        //return UtilsArrayController::organizarOutput($success, $data, null);
    }
    
    /**
     * @param type Horario
     * @return type Array
     */
    public function getIds($horario) {
        $mensaje = 'HORARIO NO REGISTRADO';
        $data = null;
        $success = false;
        $servicioBloque = BloqueService::getInstance($this->dbAdapter);
        $bloque = $servicioBloque->obtenerIdsBloque($horario->getBloque());
        $servicioAula = AulaService::getInstance($this->dbAdapter);
        $aula = $servicioAula->getRegistro($horario->getAula());
        if ($horario->getId() != null){
            $success = true;
            $data[0] = $horario->objectToArray();            
            $data[0]['_bloque'] = $bloque['data'][0];
            $data[0]['_aula'] = $aula['data'][0]['codigoExterno'];
            $mensaje = 'HORARIO ENCONTRADO';
        }
        return $this->setOuput($success, $data, $mensaje);
    }
   
    /**
     * @param type Array
     * @return type Array
     */
    public function llenarArreglo($registros) {
        foreach ($registros as $row) {
            $horarios[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($horarios); $i++) {
            $horario = $this->getRegistroCompleto($horarios[$i]['id']);
            $horarios[$i] = $horario['data'];
        }
        return $horarios;
    }
   
    /**
     * @param type Array
     * @return type Array
     */
    public function llenarArregloIds($registros) {
        foreach ($registros as $row) {
            $horarios[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($horarios); $i++) {
            $horario = $this->obtenerIdsHorario($horarios[$i]['id']);
            $horarios[$i] = $horario['data'];
        }
        return $horarios;
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getRegistrosSegunIdOrganizacionSeccion($idOrganizacionSeccion){
        $mensaje = 'HORARIO NO REGISTRADO';
        $success = false;
        $registros = $this->getHorarioDao()->getHorarioSegunIdOrganizacionSeccion($idOrganizacionSeccion);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'HORARIO ENCONTRADO';
            $horarios = $this->llenarArreglo($registros);
        }
        else {
            $horarios = NULL;
        }
        return $this->setOuput($success, $horarios, $mensaje);
    }
    

    /**
     * @param type Id
     * @return type Array
     */
    public function getIdsSegunIdOrganizacionSeccion($idOrganizacionSeccion){
        $mensaje = 'HORARIO NO REGISTRADO';
        $success = false;
        $registros = $this->getHorarioDao()->getHorarioSegunIdOrganizacionSeccion($idOrganizacionSeccion);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'HORARIO ENCONTRADO';
            $horarios = $this->llenarArregloIds($registros);
        }
        else {
            $horarios = NULL;
        }
        return $this->setOuput($success, $horarios, $mensaje);
    }
}